/**
 * 
 */
package com.study.proxy.cglib;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 *
 * 创建动态代理对象
 * 动态代理不需要实现接口,但是需要指定接口类型
 * @author Administrator
 * @date 2019年6月4日
 */
public class OrderServiceProxyFactory implements MethodInterceptor {

	//维护一个目标对象
    private Object target;
    public OrderServiceProxyFactory(Object target){
        this.target=target;
    }
   
    public Object getProxyInstance(){
    	//1. 工具类
    	Enhancer enchancer = new Enhancer();
    	//2. 设置父类
    	enchancer.setSuperclass(target.getClass());
    	//3. 设置回调函数
    	enchancer.setCallback(this);
    	
		return enchancer.create();
    }
	/* (non-Javadoc)
	 * @see org.springframework.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], org.springframework.cglib.proxy.MethodProxy)
	 * 实现MethodInterceptor接口的intercept方法后，所有生成的代理方法都调用这个方法。
		intercept方法的具体参数有
		1.  obj 目标类的实例
		2.	method 目标方法实例（通过反射获取的目标方法实例）
		3.	args 目标方法的参数
		4.	proxy 代理类的实例
	 */
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

		System.out.println("开始日志记录..");
		//Object result = method.invoke(obj, args);
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("结束日志记录..");

		return result;
	}
}